(()=>{
  // 1、函数 与js类似，唯一不同的是增加了类型限制
  // myAdd2 函数名
  // (x: number, y: number) => number  函数类型 
  // function(x: number, y: number): number {return x + y} 符合上面类型的函数体
  let myAdd2: (x: number, y: number) => number = function(x: number, y: number): number {
  return x + y
  }
  // console.log(myAdd2(1,2))

  // 2、可选参数和默认参数  默认参数：默认有值   可选参数：用？修饰

  // 3、剩余参数 ...args:string[]

  // 4、函数重载  函数名相同, 而形参不同的多个函数
  /* 
  函数重载: 函数名相同, 而形参不同的多个函数
  需求: 我们有一个add函数，它可以接收2个string类型的参数进行拼接，也可以接收2个number类型的参数进行相加 
   */
// 重载函数声明
function add (x: string, y: string): string
function add (x: number, y: number): number

// 定义函数实现
function add(x: string | number, y: string | number): string | number {
  // 在实现上我们要注意严格判断两个参数的类型是否相等，而不能简单的写一个 x + y
  if (typeof x === 'string' && typeof y === 'string') {
    return x + y
  } else if (typeof x === 'number' && typeof y === 'number') {
    return x + y
  }
}

// console.log(add(1, 2))
// console.log(add('a', 'b'))
// console.log(add(1,'1')) //没有与此调用匹配的重载
// console.log(add('1',1)) //没有与此调用匹配的重载


})()